<html>
	<head>
		<title>BlackStar Monitor&amp;Profile System</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<link rel="stylesheet" type="text/css"
			href="/static/extjs/resources/css/ext-all.css" rel="stylesheet" />
		<link rel="stylesheet" type="text/css" href="/static/css/default.css"
			rel="stylesheet" />		
	</head>
	<body>
		<h1>BlackStar PerformanceAgent如何保证高性能</h1>
		<h3>&nbsp;&nbsp;&nbsp;1.使用objectweb-asm精确地将如下监控代码的bytecode嵌入到需要监控的业务方法中，实际执行性能将与在代码中直接写如下代码一致</h3>
		<h4>
			<table border="1" width="90%">
				<tr>
					<td>
					long time = java.lang.System.nanoTime();<br>
					try<br>
					{<br>
					&nbsp;&nbsp; ...业务方法代码<br>
					}<br>
					finally<br>
					{<br>
					&nbsp;&nbsp;time = System.nanoTime() - time;<br>
					&nbsp;&nbsp;blackstar.performance.InvokePerformance.invokeMethod(className, methodName, time);<br>
					}
					</td>
				</tr>
			</table>
		</h4>
		<h3>&nbsp;&nbsp;&nbsp;2.对于InvokePerformance的内部实现尽量使用final属性、final函数、final类、static函数、private函数和不使用接口，以保证在运行期JVM对InvokePerformance内部实现的bytecode进行必要的内联和native优化</h3>
    	<h3>&nbsp;&nbsp;&nbsp;3.精心编写的文件写接口保证产生的bytecode的高效性(减少字符串的复制、调用的层次等等)、使用buffer(默认1M写一次，可以配置)、异步化(文件写入异步化)、使用定时程序进行文件切换而不是每次判断等手段减少PerformanceAgent对业务执行的影响</h3>
   		<h3>&nbsp;&nbsp;&nbsp;4.对于PerformanceAgent本身增加统计JMX，对PerformanceAgent本身的性能可以做到知根知底，目前在本机(Intel 双核1.6G的CPU、1.5G内存)上以jforum作为测试程序测试的结果是，总共200万次采集，平均5微妙/次的处理性能，即每20万次采集会增加1秒的性能trade-off</h3>
		<h4>
			<table border="1" width="90%">
				<tr>
					<td>
					同一机器上的测试数据比较：
					</td>
				</tr>
				<tr>
					<td>
#log4配置<br>
log4j.rootLogger=INFO, fileLogger<br>
log4j.appender.fileLogger=org.apache.log4j.RollingFileAppender<br>
log4j.appender.fileLogger.DatePattern=yyyyMMdd<br>
log4j.appender.fileLogger.MaxFileSize=10MB<br>
log4j.appender.fileLogger.MaxBackupIndex=5<br>
log4j.appender.fileLogger.File=${app.log}/log.log
log4j.appender.fileLogger.layout=org.apache.log4j.PatternLayout<br>
#只简单输出信息<br>
log4j.appender.fileLogger.layout.ConversionPattern=%m%n<br>
<br>
Log LOGGER = LogFactory.getLog(Test.class);<br>
long begin = System.nanoTime();<br>
//20万次<br>
for (int i=0; i<200000; i++)<br>
{<br>
&nbsp;&nbsp;LOGGER.info("Test");<br>
}<br>
long end = System.nanoTime();<br>
System.out.println("time:" + (end - begin));<br>
<br>
log4j  3.0秒<br>
					</td>
				</tr>
				<tr>
					<td>
long begin = System.nanoTime();<br>
//20万次<br>
for (int i=0; i<200000; i++)<br>
{<br>
&nbsp;&nbsp;System.out.println("Test");<br>
}<br>
long end = System.nanoTime();<br>
System.out.println("time:" + (end - begin));<br>
System.out 5.9秒 
					</td>
				</tr>
			</table>
		</h4>
		<h3>&nbsp;&nbsp;&nbsp;5.支持正则表达式的point-cut配置支持只对感兴趣的方法进行监控(譬如只对DAO、Service、Action或调用外部的接口的非setter/getter方法进行性能监控)，以减少非必要的采集</h3>
	</body>
</html>